package com.sky.controller.user;

import com.sky.entity.AddressBook;
import com.sky.result.Result;
import com.sky.service.AddressBookService;
import com.sky.utils.JwtUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/user/addressBook")
@Api(tags = "C端地址簿接口")
public class AddressBookController {

    @Autowired
    AddressBookService addressBookService;

    /**
     * 获取用户的默认地址
     *
     * @param authentication 用户的认证信息，用于从JWT中解析用户ID
     * @return 返回一个Result对象，其中包含用户的默认地址信息
     */
    @GetMapping("/default")
    @ApiOperation("查询默认地址")
    public Result<AddressBook> getDefaultAddress(@RequestHeader String authentication) {
        // 从认证信息中解析用户ID
        Long userId = JwtUtil.parseJWT(authentication).get("userId", Long.class);

        // 查询用户ID为$userId$且标记为默认地址的地址簿信息
        AddressBook address = addressBookService.query()
                .eq("user_id", userId)
                .eq("is_default", 1)
                .one();

        // 返回查询到的默认地址信息
        return Result.success(address);
    }

    /**
     * 获取用户地址列表
     *
     * @param authentication 请求头中的认证信息，用于识别用户
     * @return 包含地址簿列表的Result对象
     */
    @GetMapping("/list")
    @ApiOperation("查询地址列表")
    public Result<List<AddressBook>> getAddressList(@RequestHeader String authentication){
        // 从认证信息中解析用户ID
        Long userId = JwtUtil.parseJWT(authentication).get("userId", Long.class);
        // 查询与用户ID关联的所有地址簿
        List<AddressBook> addressList = addressBookService.query()
                .eq("user_id", userId)
                .list();
        // 返回查询到的地址簿列表
        return Result.success(addressList);
    }


    /**
     * 保存用户地址信息
     *
     * @param address 用户地址信息，包含需要保存的地址详情
     * @param authentication 用户的认证信息，用于验证用户身份
     * @return 返回保存地址信息的结果
     */
    @PostMapping
    @ApiOperation("保存地址")
    public Result saveAddress(@RequestBody AddressBook address,@RequestHeader String authentication){
        // 从认证信息中解析出用户ID
        Long userId = JwtUtil.parseJWT(authentication).get("userId", Long.class);
        // 设置地址信息中的用户ID
        address.setUserId(userId);
        // 默认设置地址为非默认地址
        address.setIsDefault(0);
        // 调用服务层方法保存地址信息
        addressBookService.save(address);
        // 返回成功结果
        return Result.success();
    }

    @GetMapping("/{id}")
    @ApiOperation("根据id查询地址")
    public Result<AddressBook> getById(@PathVariable Long id) {
        AddressBook addressBook = addressBookService.getById(id);
        return Result.success(addressBook);
    }

    @PutMapping
    @ApiOperation("修改地址")
    public Result<Void> update(@RequestBody AddressBook addressBook) {
        addressBookService.updateById(addressBook);
        return Result.success();
    }

    @DeleteMapping
    @ApiOperation("删除地址")
    public Result<Void> deleteById(Long id) {
        addressBookService.removeById(id);
        return Result.success();
    }


    /**
     * 设置默认地址
     * 当用户设置一个地址为默认地址时，该方法会将用户的所有其他地址标记为非默认，并将指定的地址标记为默认地址
     *
     * @param address 包含用户选择的默认地址信息的地址簿对象
     * @param authentication 用户的认证信息，用于验证用户身份
     * @return 返回操作结果，成功则返回成功结果
     */
    @PutMapping("/default")
    @ApiOperation("设置默认地址")
    public Result setDefaultAddress(@RequestBody AddressBook address,@RequestHeader String authentication){
        // 从认证信息中解析出用户ID
        Long userId = JwtUtil.parseJWT(authentication).get("userId", Long.class);

        // 将该用户的所有地址标记为非默认地址
        addressBookService.update()
                .eq("user_id",userId)
                .set("is_default",0)
                .update();

        // 将指定的地址标记为默认地址
        addressBookService.update()
                .eq("id",address.getId())
                .set("is_default",1)
                .update();

        // 返回成功结果
        return Result.success();
    }
}
